/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.mzk.lidovky.articles.domain;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Martin Řehánek (rehan@mzk.cz)
 */
public class Genre {

    private List<Genre> allGenre = null;
    private String genre;
    private static final String WHITESPACE = " ";

    public static final Genre UNKNOWN = new Genre("unknown");
    public static final Genre CULTURE = new Genre("Kultura");
    public static final Genre CULTURE1 = new Genre("Československo");
    public static final Genre CULTURE2 = new Genre("Ostatní státy");
    public static final Genre CULTURE_1 = new Genre("Všeobecné otázky");
    public static final Genre CULTURE_11 = new Genre("Kulturní politika. Kulturní život");
    public static final Genre CULTURE_12 = new Genre("Osvěta");
    public static final Genre CULTURE_13 = new Genre("Kulturní styky Čechů a Slováků");
    public static final Genre CULTURE_2 = new Genre("Ostatní otázky");
    public static final Genre CULTURE_3 = new Genre("Věda. Vědecké otázky");
    public static final Genre CULTURE_31 = new Genre("Věda všeobecně");
    public static final Genre CULTURE_32 = new Genre("Vědecké ústavy. Výzkumné ústavy");
    public static final Genre CULTURE_5 = new Genre("Kulturní organizace a instituce");
    public static final Genre CULTURE_51 = new Genre("Všeobecně. Dějiny. Učitelé");
    public static final Genre CULTURE_52 = new Genre("Mimoškolní vzdělávání a zájmová činnost");
    public static final Genre CULTURE_53 = new Genre("Archivy");
    public static final Genre CULTURE_54 = new Genre("Knihovny. Informační střediska");
    public static final Genre CULTURE_55 = new Genre("Muzea. Galerie. Kronikářství");
    public static final Genre CULTURE_56 = new Genre("Památková péče. Památky");
    public static final Genre CULTURE_57 = new Genre("Nakladatelství. Tiskárny. Knihkupectví");
    public static final Genre CULTURE_58 = new Genre("Noviny a časopisy");
    public static final Genre CULTURE_59 = new Genre("Spolky. Společnosti");
    public static final Genre EDUCATION = new Genre("Školství");
    public static final Genre EDUCATION_41 = new Genre("Všeobecně. Dějiny. Učitelé");
    public static final Genre EDUCATION_42 = new Genre("Předškolní výchova");
    public static final Genre EDUCATION_43 = new Genre("Základní a všeobecné vzdělání");
    public static final Genre EDUCATION_431 = new Genre("Všeobecné otázky");
    public static final Genre EDUCATION_432 = new Genre("Školy 1., 2., a 3. stupně");
    public static final Genre EDUCATION_433 = new Genre("Školy pro úchylnou mládež");
    public static final Genre EDUCATION_434 = new Genre("Učňovské základní školy. Živnostenský dorost");
    public static final Genre EDUCATION_435 = new Genre("Vysoké školy");
    public static final Genre EDUCATION_4351 = new Genre("Vysoké školy a jejich organizace");
    public static final Genre EDUCATION_4352 = new Genre("Studentstvo. Spolky. Internáty");
    public static final Genre LINGUISTICS = new Genre("Jazykověda");
    public static final Genre LINGUISTICS1 = new Genre("Všeobecné otázky");
    public static final Genre LINGUISTICS12 = new Genre("Slavistika");
    public static final Genre LINGUISTICS2 = new Genre("Jazykověda česká a slovenská");
    public static final Genre LINGUISTICS21 = new Genre("Všeobecné otázky");
    public static final Genre LINGUISTICS211 = new Genre("Jazykověda všeobecně. Životopisy");
    public static final Genre LINGUISTICS212 = new Genre("Spisovný jazyk");
    public static final Genre LINGUISTICS213 = new Genre("Nářečí");
    public static final Genre LINGUISTICS22 = new Genre("Lexikologie");
    public static final Genre LINGUISTICS221 = new Genre("Slovníky. Názvosloví");
    public static final Genre LINGUISTICS23 = new Genre("Gramatika. Stylistika. Pravopis");
    public static final Genre LINGUISTICS3 = new Genre("Jazykověda ostatních národů");
    public static final Genre LINGUISTICS4 = new Genre("Esperanto");
    public static final Genre LITERATURE = new Genre("Literatura");
    public static final Genre LITERATURE1 = new Genre("Teorie a dějiny literatury. Literární kritika");
    public static final Genre LITERATURE11 = new Genre("Všeobecné otázky");
    public static final Genre LITERATURE12 = new Genre("Česká a slovenská literatura");
    public static final Genre LITERATURE121 = new Genre("Všeobecné otázky");
    public static final Genre LITERATURE122 = new Genre("Organizace spisovatelů");
    public static final Genre LITERATURE123 = new Genre("Teorie literatury a literární směry");
    public static final Genre LITERATURE124 = new Genre("Literární historie a kritika");
    public static final Genre LITERATURE125 = new Genre("Spisovatelé, jejích život a dílo");
    public static final Genre LITERATURE126 = new Genre("Otázky překladu");
    public static final Genre LITERATURE127 = new Genre("Styky a vztahy českých a slovenských spisovatelů");
    public static final Genre LITERATURE128 = new Genre("Otázky literatury pro mládež a pro děti");
    public static final Genre LITERATURE129 = new Genre("Večírky a matiné (o jednotlivcích do 1.2.5)");
    public static final Genre LITERATURE1210 = new Genre("Soutěže, ankety, literární ceny");
    public static final Genre LITERATURE2 = new Genre("Krásná literatura. Texty");
    public static final Genre LITERATURE21 = new Genre("Česká a slovenská literatura");
    public static final Genre LITERATURE211 = new Genre("Poezie");
    public static final Genre LITERATURE212 = new Genre("Próza");
    public static final Genre LITERATURE213 = new Genre("Drama (kratší dramatické formy)");
    public static final Genre LITERATURE3 = new Genre("Dětská literatura");
    public static final Genre LITERATURE31 = new Genre("Původní tvorba");
    public static final Genre LITERATURE311 = new Genre("Poezie");
    public static final Genre LITERATURE312 = new Genre("Próza");
    public static final Genre LITERATURE313 = new Genre("Drama (kratší dramatické formy)");
    public static final Genre LITERATURE32 = new Genre("Překladová tvorba");
    public static final Genre LITERATURE321 = new Genre("Poezie");
    public static final Genre LITERATURE322 = new Genre("Próza");
    public static final Genre LITERATURE4 = new Genre("Folklór. Díla lidové tvořivosti");
    public static final Genre LITERATURE41 = new Genre("Ústní podání, pohádky, legendy");
    public static final Genre LITERATURE42 = new Genre("Lidová poezie");
    public static final Genre LITERATURE43 = new Genre("Lidové a zlidovělé písně");
    public static final Genre LITERATURE44 = new Genre("Přísloví a pořekadla");
    public static final Genre ART = new Genre("Umění");
    public static final Genre ART1 = new Genre("Všeobecné otázky");
    public static final Genre ART11 = new Genre("Estetiáka umění");
    public static final Genre ART12 = new Genre("Umění výtvarné");
    public static final Genre ART13 = new Genre("Film");
    public static final Genre ART2 = new Genre("Československo");
    public static final Genre ART21 = new Genre("Všeobecné otázky umění");
    public static final Genre ART211 = new Genre("Tvorba. Sjezdy umělců");
    public static final Genre ART212 = new Genre("Spolky výtvarníků");
    public static final Genre ART22 = new Genre("Architektura. Stavba měst");
    public static final Genre ART23 = new Genre("Sochařství. Malířství. Grafika");
    public static final Genre ART231 = new Genre("Všeobecné otázky. Životopisy");
    public static final Genre ART232 = new Genre("Výstavy");
    public static final Genre ART2321 = new Genre("Výstavy jednotlivých umělců");
    public static final Genre ART2322 = new Genre("Výstavy uměleckých skupin a spolků");
    public static final Genre ART24 = new Genre("Užité umění");
    public static final Genre ART241 = new Genre("Lidová umělecká výroba");
    public static final Genre ART242 = new Genre("Jednotlivá umění");
    public static final Genre ART25 = new Genre("Hudba");
    public static final Genre ART251 = new Genre("Všeobecné otázky. Životopisy");
    public static final Genre ART252 = new Genre("Hudební organizace, svazy");
    public static final Genre ART253 = new Genre("Koncerty. Festivaly");
    public static final Genre ART254 = new Genre("Inscenace oper a operet");
    public static final Genre ART255 = new Genre("Konkursy a soutěže");
    public static final Genre ART26 = new Genre("Divadlo");
    public static final Genre ART261 = new Genre("Všeobecné otázky. Životopisy");
    public static final Genre ART262 = new Genre("Jednotlivá divadla. Inscenace činoher");
    public static final Genre ART263 = new Genre("Inscenace divadelních her v rozhlase");
    public static final Genre ART264 = new Genre("Taneční umění");
    public static final Genre ART265 = new Genre("Ochotnické divadlo");
    public static final Genre ART266 = new Genre("Loutkařství");
    public static final Genre ART27 = new Genre("Lidová umělecká tvořivost. Zpěvácké sbory. Slavnosti");
    public static final Genre ART28 = new Genre("Film. Fotografie");
    public static final Genre ART281 = new Genre("Všeobecné otázky");
    public static final Genre ART282 = new Genre("Referáty o filmech");
    public static final Genre ART283 = new Genre("Fotografie");

//    public Genre valueOf(int value){
//        for (int i=0; i<Genre.values(); i++){
//            if (value == i){
//                return
//            }
//        }
//    }
    public Genre(List<Genre> allGenre) {
        this.allGenre = new ArrayList<Genre>(allGenre);
    }

    public Genre(String genre) {
        this.genre = genre;
    }

    public static Genre valueOf(int value) {
        switch (value) {
            case 0:
                return UNKNOWN;
            case 1:
                return CULTURE;
            case 2:
                return LINGUISTICS;
            case 3:
                return LITERATURE;
            case 4:
                return ART;
            case 5:
                return EDUCATION;
            default:
                return UNKNOWN;
        }
    }

    public static Genre valueOfCulture(String value) {

        List<Genre> genreList = new ArrayList<Genre>();
        genreList.add(new Genre(value));
        value = removeWhiteSpaces(value);
        genreList.add(CULTURE);

        if (value.startsWith("I.2")) {
            genreList.add(CULTURE2);
        } else if (value.startsWith("I.1")) {
            genreList.add(CULTURE1);
        }

        /*
         * prefix I._.
         */
        if (value.length() > 4) {
            if (value.substring(4, 5).equals("1")) {
                genreList.add(CULTURE_1);

                //prefix I._.1.
                if (value.length() > 6) {
                    if (value.substring(6, 7).equals("1")) {
                        genreList.add(CULTURE_11);
                    } else if (value.substring(6, 7).equals("2")) {
                        genreList.add(CULTURE_12);
                    } else if (value.substring(6, 7).equals("3")) {
                        genreList.add(CULTURE_13);
                    }
                    errorPrint(8, value);

                }
            } else if (value.substring(4, 5).equals("2")) {
                //prefix I._.2.
                genreList.add(CULTURE_2);
                errorPrint(6, value);

            } else if (value.substring(4, 5).equals("3")) {
                genreList.add(CULTURE_3);

                //prefix I._.3.
                if (value.length() > 6) {
                    if (value.substring(6, 7).equals("1")) {
                        genreList.add(CULTURE_31);
                    } else if (value.substring(6, 7).equals("2")) {
                        genreList.add(CULTURE_32);
                    }
                }
                errorPrint(8, value);

            } else if (value.substring(4, 5).equals("5")) {
                genreList.add(CULTURE_5);

                //prefix I._.5.
                if (value.length() > 6) {
                    if (value.substring(6, 7).equals("1")) {
                        genreList.add(CULTURE_51);
                    } else if (value.substring(6, 7).equals("2")) {
                        genreList.add(CULTURE_52);
                    } else if (value.substring(6, 7).equals("3")) {
                        genreList.add(CULTURE_53);
                    } else if (value.substring(6, 7).equals("4")) {
                        genreList.add(CULTURE_54);
                    } else if (value.substring(6, 7).equals("5")) {
                        genreList.add(CULTURE_55);
                    } else if (value.substring(6, 7).equals("6")) {
                        genreList.add(CULTURE_56);
                    } else if (value.substring(6, 7).equals("7")) {
                        genreList.add(CULTURE_57);
                    } else if (value.substring(6, 7).equals("8")) {
                        genreList.add(CULTURE_58);
                    } else if (value.substring(6, 7).equals("9")) {
                        genreList.add(CULTURE_59);
                    }
                    errorPrint(8, value);
                }
            }
        }
        return new Genre(genreList);
    }

    public static Genre valueOfLiterature(String value) {

        List<Genre> genreList = new ArrayList<Genre>();
        genreList.add(new Genre(value));
        value = removeWhiteSpaces(value);
        genreList.add(LITERATURE);

        if (value.startsWith("III.1")) {
            genreList.add(LITERATURE1);
            if (value.startsWith("III.1.1")) {
                genreList.add(LITERATURE11);
            } else if (value.startsWith("III.1.2")) {
                genreList.add(LITERATURE12);
                if (value.startsWith("III.1.2.1")) {
                    genreList.add(LITERATURE121);
                } else if (value.startsWith("III.1.2.2")) {
                    genreList.add(LITERATURE122);
                } else if (value.startsWith("III.1.2.3")) {
                    genreList.add(LITERATURE123);
                } else if (value.startsWith("III.1.2.4")) {
                    genreList.add(LITERATURE124);
                } else if (value.startsWith("III.1.2.5")) {
                    genreList.add(LITERATURE125);
                } else if (value.startsWith("III.1.2.6")) {
                    genreList.add(LITERATURE126);
                } else if (value.startsWith("III.1.2.7")) {
                    genreList.add(LITERATURE127);
                } else if (value.startsWith("III.1.2.8")) {
                    genreList.add(LITERATURE128);
                } else if (value.startsWith("III.1.2.9")) {
                    genreList.add(LITERATURE129);
                } else if (value.startsWith("III.1.2.10")) {
                    genreList.add(LITERATURE1210);
                }
                errorPrint(10, value);
            }
        } else if (value.startsWith("III.2")) {
            genreList.add(LITERATURE2);
            if (value.startsWith("III.2.1")) {
                genreList.add(LITERATURE21);
                if (value.startsWith("III.2.1.1")) {
                    genreList.add(LITERATURE211);
                } else if (value.startsWith("III.2.1.2")) {
                    genreList.add(LITERATURE212);
                } else if (value.startsWith("III.2.1.3")) {
                    genreList.add(LITERATURE213);
                }
                errorPrint(10, value);
            }
        } else if (value.startsWith("III.3")) {
            genreList.add(LITERATURE3);
            if (value.startsWith("III.3.1")) {
                genreList.add(LITERATURE31);
                if (value.startsWith("III.3.1.1")) {
                    genreList.add(LITERATURE311);
                } else if (value.startsWith("III.3.1.2")) {
                    genreList.add(LITERATURE312);
                } else if (value.startsWith("III.3.1.3")) {
                    genreList.add(LITERATURE313);
                }
                errorPrint(10, value);
            } else if (value.startsWith("III.3.2")) {
                genreList.add(LITERATURE32);
                if (value.startsWith("III.3.2.1")) {
                    genreList.add(LITERATURE321);
                } else if (value.startsWith("III.3.2.2")) {
                    genreList.add(LITERATURE322);
                }
                errorPrint(10, value);
            }
        } else if (value.startsWith("III.4")) {
            genreList.add(LITERATURE4);
            if (value.startsWith("III.4.1")) {
                genreList.add(LITERATURE41);
            } else if (value.startsWith("III.4.2")) {
                genreList.add(LITERATURE42);
            } else if (value.startsWith("III.4.3")) {
                genreList.add(LITERATURE43);
            } else if (value.startsWith("III.4.4")) {
                genreList.add(LITERATURE44);
            }
            errorPrint(8, value);
        }
        return new Genre(genreList);
    }

    public static Genre valueOfLinguistics(String value) {

        List<Genre> genreList = new ArrayList<Genre>();
        genreList.add(new Genre(value));
        value = removeWhiteSpaces(value);
        genreList.add(LINGUISTICS);

        if (value.startsWith("II.1")) {
            genreList.add(LINGUISTICS1);
            if (value.startsWith("II.1.2")) {
                genreList.add(LINGUISTICS12);
            }
            errorPrint(7, value);

        } else if (value.startsWith("II.2")) {
            genreList.add(LINGUISTICS2);
            if (value.startsWith("II.2.1")) {
                genreList.add(LINGUISTICS21);
                if (value.startsWith("II.2.1.1")) {
                    genreList.add(LINGUISTICS211);
                } else if (value.startsWith("II.2.1.2")) {
                    genreList.add(LINGUISTICS212);
                } else if (value.startsWith("II.2.1.3")) {
                    genreList.add(LINGUISTICS213);
                }
                errorPrint(9, value);

            } else if (value.startsWith("II.2.2")) {
                genreList.add(LINGUISTICS22);
                if (value.startsWith("II.2.2.1")) {
                    genreList.add(LINGUISTICS221);
                }
                errorPrint(9, value);

            } else if (value.startsWith("II.2.3")) {
                genreList.add(LINGUISTICS23);
                errorPrint(7, value);
            }


        } else if (value.startsWith("II.3")) {
            genreList.add(LINGUISTICS3);
            errorPrint(5, value);
        } else if (value.startsWith("II.4")) {
            genreList.add(LINGUISTICS4);
            errorPrint(5, value);
        }

        return new Genre(genreList);
    }

    public static Genre valueOfEducation(String value) {

        List<Genre> genreList = new ArrayList<Genre>();
        genreList.add(new Genre(value));
        value = removeWhiteSpaces(value);
        genreList.add(EDUCATION);

        if (value.startsWith("I.2.4")) {
            genreList.add(CULTURE2);
        } else if (value.startsWith("I.1.4")) {
            genreList.add(CULTURE1);
        }

        /*
         * prefix I._.4
         */
        if (value.length() > 6 && value.substring(6, 7).equals("1")) {
            genreList.add(EDUCATION_41);
        } else if (value.length() > 6 && value.substring(6, 7).equals("2")) {
            genreList.add(EDUCATION_42);
        } else if (value.length() > 6 && value.substring(6, 7).equals("3")) {
            genreList.add(EDUCATION_43);

            //prefix I._.4.3
            if (value.length() > 8 && value.substring(8, 9).equals("1")) {
                genreList.add(EDUCATION_431);
            } else if (value.length() > 8 && value.substring(8, 9).equals("2")) {
                genreList.add(EDUCATION_432);
            } else if (value.length() > 8 && value.substring(8, 9).equals("3")) {
                genreList.add(EDUCATION_433);
            } else if (value.length() > 8 && value.substring(8, 9).equals("4")) {
                genreList.add(EDUCATION_434);
            } else if (value.length() > 8 && value.substring(8, 9).equals("5")) {
                genreList.add(EDUCATION_435);

                //prefix I._.4.3.5
                if (value.length() > 10 && value.substring(10, 11).equals("1")) {
                    genreList.add(EDUCATION_4351);
                } else if (value.length() > 10 && value.substring(10, 11).equals("2")) {
                    genreList.add(EDUCATION_4352);
                }
                errorPrint(12, value);
            }
        }
        return new Genre(genreList);
    }

    public static Genre valueOfArt(String value) {

        List<Genre> genreList = new ArrayList<Genre>();
        genreList.add(new Genre(value));
        value = removeWhiteSpaces(value);
        genreList.add(ART);

        if (value.startsWith("IV.1")) {
            genreList.add(ART1);
            if (value.startsWith("IV.1.1")) {
                genreList.add(ART11);
            } else if (value.startsWith("IV.1.2")) {
                genreList.add(ART12);
            } else if (value.startsWith("IV.1.3")) {
                genreList.add(ART13);
            }
            errorPrint(7, value);

        } else if (value.startsWith("IV.2")) {
            genreList.add(ART2);
            if (value.startsWith("IV.2.1")) {
                genreList.add(ART21);
                if (value.startsWith("IV.2.1.1")) {
                    genreList.add(ART211);
                } else if (value.startsWith("IV.2.1.2")) {
                    genreList.add(ART212);
                }
                errorPrint(9, value);

            } else if (value.startsWith("IV.2.2")) {
                genreList.add(ART22);
            } else if (value.startsWith("IV.2.3")) {
                genreList.add(ART23);
                if (value.startsWith("IV.2.3.1")) {
                    genreList.add(ART231);
                } else if (value.startsWith("IV.2.3.2")) {
                    genreList.add(ART232);
                    if (value.startsWith("IV.2.3.2.1")) {
                        genreList.add(ART2321);
                    } else if (value.startsWith("IV.2.3.2.2")) {
                        genreList.add(ART2322);
                    }
                    errorPrint(11, value);
                }

            } else if (value.startsWith("IV.2.4")) {
                genreList.add(ART24);
                if (value.startsWith("IV.2.4.1")) {
                    genreList.add(ART241);
                } else if (value.startsWith("IV.2.4.2")) {
                    genreList.add(ART242);
                }

                errorPrint(9, value);
            } else if (value.startsWith("IV.2.5")) {
                genreList.add(ART25);
                if (value.startsWith("IV.2.5.1")) {
                    genreList.add(ART251);
                } else if (value.startsWith("IV.2.5.2")) {
                    genreList.add(ART252);
                } else if (value.startsWith("IV.2.5.3")) {
                    genreList.add(ART253);
                } else if (value.startsWith("IV.2.5.4")) {
                    genreList.add(ART254);
                } else if (value.startsWith("IV.2.5.5")) {
                    genreList.add(ART255);
                }
                errorPrint(9, value);

            } else if (value.startsWith("IV.2.6")) {
                genreList.add(ART26);
                if (value.startsWith("IV.2.6.1")) {
                    genreList.add(ART261);
                } else if (value.startsWith("IV.2.6.2")) {
                    genreList.add(ART262);
                } else if (value.startsWith("IV.2.6.3")) {
                    genreList.add(ART263);
                } else if (value.startsWith("IV.2.6.4")) {
                    genreList.add(ART264);
                } else if (value.startsWith("IV.2.6.5")) {
                    genreList.add(ART265);
                } else if (value.startsWith("IV.2.6.6")) {
                    genreList.add(ART266);
                }
                errorPrint(9, value);

            } else if (value.startsWith("IV.2.7")) {
                genreList.add(ART27);
            } else if (value.startsWith("IV.2.8")) {
                genreList.add(ART28);
                if (value.startsWith("IV.2.8.1")) {
                    genreList.add(ART281);
                } else if (value.startsWith("IV.2.8.2")) {
                    genreList.add(ART282);
                } else if (value.startsWith("IV.2.8.3")) {
                    genreList.add(ART283);
                }
                errorPrint(9, value);
            }
        }
        return new Genre(genreList);
    }

    private static void errorPrint(int index, String value) {
        if (value.length() > index || (value.length() > (index - 1) ? !value.substring(index, index).equals(".") : false)) {
           // System.out.println("length of genre " + value + " the rest " + value.substring(index - 1, value.length()));
        }
    }

    public boolean isList(){
        if (allGenre == null){
            return false;
        }else {
            return true;
        }
    }
    
    public List<Genre> getAllGenre(){
        return allGenre;
    }


    public String myToString() {
        if (this.allGenre == null) {
            return genre;
        } else {
            StringBuilder bufferedGenre = new StringBuilder();

            for (Genre g : allGenre) {
                bufferedGenre.append(g.toString()).append("\n");
            }
            return bufferedGenre.toString();
        }
    }

    private static String removeWhiteSpaces(String string) {
        StringBuffer bufferedString = new StringBuffer(string);

        for (int i = 0; i < bufferedString.length(); i++) {

            if (bufferedString.substring(i, i + 1).equals(WHITESPACE)) {
                bufferedString.delete(i, i + 1);
                i--;
            }
        }
        return bufferedString.toString();
    }

    @Override
    public String toString(){
        return genre;
    }
}
